#!/usr/bin/env python
# -*- coding:utf-8 -*-
# @FileName  :alien_invasion.py
# @Time      :2021/4/11 8:58
# @Author    :Letquit
"""
文件说明：
    创建Pygame窗口以及响应用户输入
    创建对象
        存储在ai_settings中的设置
        存储在screen中的主显示
        飞船实例
    游戏主循环 while循环
        check_events()
        ship.update()
        update_screen()

"""
import sys
import pygame
from pygame.sprite import Group

from settings import Settings   # 导入Settings类
from ship import Ship   # 导入Ship类
from alien import Alien   # 导入Alien类
from game_stats import GameStats   # 导入GameStats类
from scoreboard import Scoreboard   # 导入Scoreboard类
from button import Button   # 导入Button类
import game_functions as gf   # 导入game_functions模块 指定gf简化


def run_game():
    # 初始化pygame、设置和屏幕对象
    pygame.init()   # 初始化背景设置

    ai_settings = Settings()    # 创建Settings实例
    screen = pygame.display.set_mode((ai_settings.screen_width, ai_settings.screen_height))    # 调用Settings属性
    # 每经过一次循环都将重绘这个窗口
    pygame.display.set_caption("Alien Invasion")   # 设置窗口标题

    # 创建Play按钮
    play_button = Button(ai_settings, screen, "Play")   # 创建实例

    # 创建一个用于存储游戏统计信息的实例
    stats = GameStats(ai_settings)
    sb = Scoreboard(ai_settings, screen, stats)

    # 创建一艘飞船、一个子弹编组和一个外星人编组
    ship = Ship(ai_settings, screen)    # 创建Ship实例
    bullets = Group()   # 存储所有有效的子弹，方便管理
    # Group()编组类似裂变，但提供了有助于开发游戏的额外的功能
    aliens = Group()   # 存储所有的外星人

    # 创建外星人群
    gf.create_fleet(ai_settings, screen, ship, aliens)    # 传递ai_settings, screen, aliens

    # 开始游戏的主循环
    while True:
        # 包含一个事件循环以及管理屏幕更新
        gf.check_events(ai_settings, screen, stats, sb, play_button, ship, aliens, bullets)     # 检查玩家的输入

        if stats.game_active:  # 判断游戏状态
            ship.update()  # 更新飞船的位置
            gf.update_bullets(ai_settings, screen, stats, sb, ship, aliens, bullets)  # 更新所有未消失的子弹的位置
            gf.update_aliens(ai_settings, stats, screen, sb, ship, aliens, bullets)  # 更新子弹后再更新外星人的位置

        gf.update_scree(ai_settings, screen, stats, sb, ship, aliens, bullets, play_button)  # 重新绘制更新后的位置


run_game()  # 初始化游戏并开始主循环
if __name__ == "__main__":
    run_code = 0
